/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package model;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.DatabaseMetaData;
import java.util.ArrayList;
import java.util.HashMap;


/**
 *
 * @author student
 */
public class DatenVerwaltung 
{
  
    static HashMap < String,  Benutzer > benutzer = new HashMap<>();
    static ArrayList<Immobilie> immobilien = new ArrayList<>(); 
    static boolean neu = true;
    
    /**
     * Default Kontruktor 
     */
    public DatenVerwaltung()
    {
    }
    /**
     * 
     * @return this.neu
     */
    public boolean getNeu(){
        return this.neu;
    }
    /**
     * 
     * @param arg 
     */
    public void setNeu(boolean arg){
        this.neu = arg;
    }
    
   /**
    * Methode zum erstellen von Test Benutzer
    * mit den jeweiligen Rollen
    */
    public void testNutzerErstellen()
    {
        benutzerHinzufuegen(1,"Marcel", 1, "hallo@dieappentwickler.de", "krause", "054175161", "017627886062", "Herr", "Marcel", "Krause", 49086, "Osnabrück", "Assmannstrasse", 14);
        benutzerHinzufuegen(2,"Edgar", 2, "recruting@apple.com", "julca", "054175161", "017627886062", "Herr", "Edgar", "Julca", 33758, "Schloss Holte", "irgendwostraße", 73);
        benutzerHinzufuegen(3,"Carsten", 3, "carsten@greif.de", "greif", "054175161", "017627886062", "Herr", "Carsten", "Greif", 32584, "Löhne", "wasweisichwo", 42);
        
    }
    /**
     * Methode zum erstellen von 
     * Test Immobilien
     */    
    public void testImmobilienErstellen()
    {
        /*
        *   id: Int , fk_id : int , status(1mieten, 2kaufen): Int, etage: Int, 
        *   etagen: Int, badezm: int , schlafzm :int, 
        *   balkon: boolean , keller: Boolean garten: Boolean, 
        *   baujahr : Int, zimmer : Int, 
        *   preis: Double, nebenkosten : Doule, kaution: Double, provision: double, 
        *   wohnfläche: double, 
        *   titel: String, ort: String, plz: Int, strasse: String, nummer: Int,
        *   zustand : String, heizung: String, beschreibung : String, ausst : String, lage: String,
        *   sonstiges: Strting
        */
        /**
         * Osnabrück
         */
        immobilieHinzufuegen(1, 1, 1, 1, 4, 1, 3, true, false, true, 1995, 4, 680, 100, 1360, 0, 102.00, "Schöne helle 4 ZKB-Wonung in 1A Lage", "Osnabrueck", 49080, "Am Gretescher Turm", 17, "gepflegt", "keine Angabe", "", "", "", "", "sofort");
        immobilieHinzufuegen(2, 1, 1, 1, 2, 1, 2, true, true, true, 1989, 3, 445, 200, 0, 0, 83.00, "ruhige Wohnung mit Balkon und Garage", "Osnabrueck", 49080, "Landrat von Ostmanstrasse", 4, "gepflegt", "keine Angabe", "", "", "", "", "01.3.2014");
        immobilieHinzufuegen(3, 3, 1, 2, 2, 3, 2, false, true, false, 2012, 4, 1920,425, 0, 0, 153.88, "LETZTE 4-Zimmer-Wohnung im Neubau", "Osnabrueck", 49076, "Heinrich-Böll-Straße", 10, "neuwertig", "keine Angabe", "", "", "", "", "15.3.2014");
        immobilieHinzufuegen(4, 3, 1, 2, 2, 2, 2, false, true, true, 2012, 3, 1890,425, 0, 0, 151.29, "Penthouse-Wohnung mit großer Dachterrasse in bester Wohnlage", "Osnabrueck", 49076, "Heinrich-Böll-Straße", 5, "gehoben", "keine Angabe", "", "", "", "", "sofort");
        immobilieHinzufuegen(5, 1, 1, 2, 5, 2, 4, true, false, false, 1985, 5, 1100,400, 2200, 0, 165.00, "Studenten aufgepasst - Prädikat: WG-geeignet!", "Osnabrueck", 49078, "Kurt-Schumacher-Damm", 1, "gepflegt", "keine Angabe", "", "", "", "", "01.4.2014");
        /**
         * Bielefeld
         */
        immobilieHinzufuegen(6, 3, 2, 3, 5, 5, 8, true, true, true, 1990, 12, 4200.6, 500.96, 10000.000, 800.00, 500.66, "Belvedere Haus", "Bielefeld", 33330, "Lux-Straße", 69, "Luxus Wohnung", "keine angaben", "", "", "", "", "12.12.14");
        immobilieHinzufuegen(7, 1, 1, 3, 5, 5, 8, true, false, true, 1998, 5, 700.6, 70, 1000.000, 80.00, 70.66, "Schöne Helle Wohnung", "Bielefeld", 33338, "Lix-Straße", 9, "Gehoben", "keine angaben", "", "", "", "", "sofort");
        immobilieHinzufuegen(8, 1, 1, 3, 5, 5, 8, true, true, true, 2005, 3, 650.0, 100, 1200.000, 80.00, 80.66, "3-Zimmer-Wohnung, Küche, Bad, Gartennutzung", "Bielefeld", 33338, "Lix-Straße", 9, "Gehoben", "keine angaben", "", "", "", "", "1.3.14");
        /**
         * Bremen
         */
        immobilieHinzufuegen(9, 1, 1, 3, 5, 5, 8, true, false, true, 1991, 5, 600.6, 90, 1200, 80.00, 70, "Renovierte Traumwohnung", "Bremen", 44488, "Lix-Straße", 9, "Renoviert", "keine angaben", "", "", "", "", "1.5.14");
        immobilieHinzufuegen(10, 3, 2, 3, 5, 5, 8, true, false, false, 1990, 2, 1100.6, 190, 2200, 80.00, 200, "barrierefreie Seniorenwohnung", "Bremen", 55550, "Lux-Straße", 69, "Luxus Wohnung", "keine angaben", "", "", "", "", "1.6.14");
        
        /**
         * Hannover
         */
        immobilieHinzufuegen(11, 1, 1, 3, 5, 5, 8, false, true, true, 1998, 5, 600, 120, 1200, 120, 70, "Wunderschöne Wohnung", "Hannover", 66666, "Lix-Straße", 9, "Gehoben", "keine angaben", "", "", "", "", "1.3.14");
        immobilieHinzufuegen(12, 3, 2, 3, 5, 5, 8, true, false, true, 1990, 2, 800, 140, 1600, 100, 200, "Ruhige Lage mit Balkon", "Hannover", 66660, "Lux-Straße", 69, "Gepflegt", "keine angaben", "", "", "", "", "sofort");
   
        for(int i=0;i<12;i++){
            for(int j=0;j<6;j++){
                immobilien.get(i).setBilder(j,"../Hausarbeit/images/img/"+i+"/"+j+".jpg");
            }
        }
        
    }
    
    /**
     * Methode um neuen Benutzer in HashMap zu speichern
     * @param id  
     * @param benutzername 
     * @param rolle 
     * @param email
     * @param pw
     * @param tel_nr
     * @param hand_nr
     * @param anrede
     * @param vorname
     * @param nachname
     * @param plz
     * @param ort
     * @param strasse
     * @param nr 
     */
    public void benutzerHinzufuegen(Integer id, String benutzername,Integer rolle, String email, String pw, String tel_nr, String hand_nr, String anrede, String vorname, String nachname, Integer plz, String ort,String strasse, Integer nr)
    {
       Benutzer neuBenutzer =new Benutzer(id, benutzername, rolle, email, pw, tel_nr, hand_nr, anrede, vorname, nachname, plz, ort, strasse, nr);
       benutzer.put(benutzername, neuBenutzer);
    }
    
    /**
     * Methode um Anzahl aller Benutzer im System zurückzugeben
     * @return (int)benutzer.size()
     */
    public int getBenutzerAnzahl ()
    {
        return(int)benutzer.size();
    }
    
    /**
     * Methode zum suchen des Nutzers anhand des Indexes
     * @param index
     * @return benutzer.get(index)
     */
    public Benutzer getBenutzerByIndex(Integer index)
    {
        return benutzer.get(index);
    }
    /**
     * Mathedo zum suchen des Nutzers anhand des Names
     * @param benutzername
     * @return benutzer.get(benutzername);
     */
    public Benutzer getBenutzerByName(String benutzername)
    {
        return benutzer.get(benutzername);
    }
    
   /**
    * Methode zum Prüfen des Logins
    * @param benutzer
    * @param passwort
    * @return boolean
    */
    public boolean pruefeLogin(String benutzer, String passwort)
    {
        Benutzer bn = getBenutzerByName(benutzer);
        if(bn != null && bn.getName().equals(benutzer)&& bn.getPw().equals(passwort))
        {
            return true;  
        }
        else
        {
            return false;
        }
    }
    
    /**
     * Methode zum Auflisten alle Benutzer
     */
    public void ListeAlleBenutzer()
    {
        for(String key : benutzer.keySet())
        {
            System.out.print("Key: "+key+" -");
            System.out.print("Value: "+benutzer.get(key)+"\n");
        }
    }
    
    /**
     * Mathedo der ein Benutzer zurück gibt
     * @return benutzer
     */
    public HashMap<String, Benutzer> getBenutzer()
    {
        return benutzer;
    }
    
    /**
     * Methode der überprüft ob ein benutzer überhaupt existert
     * @param str
     * @return Boolean
     */
    public boolean existiertBenutzer(String str){
        Benutzer bn = getBenutzerByName(str);
        if(bn==null)
            return false;
        else
            return true;
    }
    
    
    /**
     * IMMOBILIENTEIL
     * Matheode zum erstellen einer Immobilie 
     * @param i_id
     * @param fk_b_id
     * @param status
     * @param etage
     * @param etagen
     * @param badezimmer
     * @param schlafz
     * @param balkon
     * @param keller
     * @param garten
     * @param baujahr
     * @param zimmer_anz
     * @param preis
     * @param nebenkst
     * @param kaution
     * @param provision
     * @param wohnfl
     * @param titel
     * @param ort
     * @param plz
     * @param strasse
     * @param nr
     * @param zustand
     * @param heizung
     * @param objbeschreibung
     * @param ausst
     * @param lage
     * @param sonstiges
     * @param bezugsfrei 
     */
    public void immobilieHinzufuegen(int i_id, int fk_b_id, int status, int etage, int etagen, int badezimmer, int schlafz, boolean balkon, boolean keller, boolean garten, int baujahr, double zimmer_anz, double preis, double nebenkst, double kaution, double provision, double wohnfl, String titel, String ort, int plz, String strasse, int nr, String zustand, String heizung, String objbeschreibung, String ausst, String lage, String sonstiges, String bezugsfrei)
    {
        Immobilie imb = new Immobilie(i_id, fk_b_id, status, etage, etagen, badezimmer, schlafz, balkon, keller, garten, baujahr, zimmer_anz, preis, nebenkst, kaution, provision, wohnfl, titel, ort, plz, strasse, nr, zustand, heizung,  objbeschreibung, ausst, lage, sonstiges, bezugsfrei);
        immobilien.add(imb);
    }
    
    /**
     * Methode zum Entfernen von Immobilien
     * @param id 
     */
    public void immobilieEntfernen(int id)
    {
        for(int i=0;i<immobilien.size();i++){
            if(immobilien.get(i).getI_id()==id){
                immobilien.remove(i);
            }
        }
    }
     
    /**
     * Methode zum ändern der Immobilie
     * @param id
     * @param titel
     * @param preis
     * @param nebenkosten
     * @param kaution
     * @param provision
     * @param zimmer
     * @param flaeche
     * @param schlafzimmer
     * @param badezimmer
     * @param bezugsfrei
     * @param balkonb
     * @param gartenb
     * @param kellerb
     * @param ort
     * @param plz
     * @param strasse
     * @param nummer 
     */
    public void immobilieAendern(int id, String titel, double preis, double nebenkosten, double kaution, double provision, double zimmer, double flaeche, int schlafzimmer, int badezimmer, String bezugsfrei, boolean balkonb, boolean gartenb, boolean kellerb, String ort, int plz, String strasse, int nummer){
        for(int i=0;i<immobilien.size();i++){
            if(immobilien.get(i).getI_id()==id){
                immobilien.get(i).setTitel(titel);
                immobilien.get(i).setPreis(preis);
                immobilien.get(i).setNebenkst(nebenkosten);
                immobilien.get(i).setKaution(provision);
                immobilien.get(i).setZimmer_anz(zimmer);
                immobilien.get(i).setWohnfl(flaeche);
                immobilien.get(i).setSchlafz(schlafzimmer);
                immobilien.get(i).setBadezimmer(badezimmer);
                immobilien.get(i).setBezugsfrei(bezugsfrei);
                immobilien.get(i).setBalkon(balkonb);
                immobilien.get(i).setGarten(gartenb);
                immobilien.get(i).setKeller(kellerb);
                immobilien.get(i).setOrt(ort);
                immobilien.get(i).setPlz(plz);
                immobilien.get(i).setStrasse(strasse);
                immobilien.get(i).setNr(nummer);
            }
        }
    }
                        
    /**
     * Methode zum Holen der Immobilie
     * @return immobilien
     */
    public ArrayList getImmobilien()
    {
        return immobilien;
    }     
    
    /**
     * Methode zum holen der Immobilien Anzahl
     * @return (int)immobilien.size()
     */
    public int getImmobilienAnzahl ()
    {
        return(int)immobilien.size();
    }
}